package cn.zcib.film.controller;

import cn.zcib.film.anno.Record;
import cn.zcib.film.bean.SysMenu;
import cn.zcib.film.bean.vo.SysMenuVO;
import cn.zcib.film.service.SysMenuService;
import cn.zcib.film.util.*;
import com.alibaba.fastjson.JSON;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.*;

@RestController
@RequestMapping(value="/admin/menu",produces = "application/json;charset=UTF-8")
public class MenuController {
    @Resource
    private SysMenuService sysMenuService;

    /**
     * 加载左侧菜单列表
     * @return
     */
    @RequestMapping("/loadIndexMenuLeft")
    public String loadIndexMenuLeft(){
        //保存所有信息
        Map<String, Object> map = new LinkedHashMap<>();
        //保存homeInfo信息
        Map<String,Object> homeInfo = new LinkedHashMap<>();
        //保存logInfo信息
        Map<String,Object> logoInfo = new LinkedHashMap<>();
        //调用查询菜单列表方法，返回了所有菜单的信息
        List<SysMenu> menuList = sysMenuService.findMenuList(null);
        //保存菜单关系
        ArrayList<MenuNode> menuNodeList = new ArrayList<>();
        //循环遍历菜单集合
        for (SysMenu sysMenu : menuList) {
            //创建menuNode对象
            MenuNode menuNode = new MenuNode();
            menuNode.setId(sysMenu.getId());
            menuNode.setPid(sysMenu.getpId());
            menuNode.setTitle(sysMenu.getTitle());
            menuNode.setHref(sysMenu.getHref());
            menuNode.setIcon(sysMenu.getIcon());
            menuNode.setTarget(sysMenu.getTarget());
            //将menuNode对象添加到集合中，因为处理父子级关系需要返回一个集合，这个集合中包含了所有菜单的信息
            menuNodeList.add(menuNode);
        }
        //保存
        homeInfo.put("title","首页");
        homeInfo.put("href","/toIndexManager.html");

        logoInfo.put("title","后台管理系统");
        logoInfo.put("image","/static/images/logoMin.png");//静态资源文件路径,可使用默认的logo.png
        logoInfo.put("href", "");
        //对各个菜单进行处理，建立父子级关系
        map.put("menuInfo", TreeUtil.toTree(menuNodeList,  0));
        map.put("homeInfo", homeInfo);
        map.put("logoInfo",logoInfo);
        //返回json数据
        return JSON.toJSONString(map);
    }

    /**
     * 加载树状菜单列表
     * @return
     */
    @RequestMapping("/loadMenuTree")
    public DataGridViewResult loadMenuTree(){
        //调用查询所有菜单列表的方法
        List<SysMenu> permissionList = sysMenuService.findMenuList(null);
        //创建树形节点集合
        List<TreeNode> treeNodes = new ArrayList<>();
        //遍历菜单集合
        for (SysMenu sysMenu:permissionList) {
            //将数据放到节点集合中
            treeNodes.add(new TreeNode(sysMenu.getId(),sysMenu.getpId(),sysMenu.getTitle()));
        }
        return new DataGridViewResult(treeNodes);
    }

    /**
     * 查询菜单列表
     * @param vo
     * @return
     */
    @RequestMapping("/list")
    public DataGridViewResult list(SysMenuVO vo){
        //设置分页信息
        PageHelper.startPage(vo.getPage(),vo.getLimit());
        //调用查询方法
        List<SysMenu> menuList = sysMenuService.findMenuList(vo);
        //创建分页对象
        PageInfo<SysMenu> pageInfo = new PageInfo<>(menuList);
        //返回数据
        return new DataGridViewResult(pageInfo.getTotal(),pageInfo.getList());
    }

    /**
     * 添加菜单
     * @param menu
     * @return
     */
    @RequestMapping("/add")
    public String addMenu(SysMenu menu){
        HashMap<String, Object> map = new HashMap<>();

        if (sysMenuService.insertMenu(menu)>0){
            map.put(SystemConstants.SUCCESS, true);
            map.put(SystemConstants.MESSAGE, "添加成功");
        }else {
            map.put(SystemConstants.SUCCESS, false);
            map.put(SystemConstants.MESSAGE, "添加失败");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 更新菜单
     * @param menu
     * @return
     */
    @RequestMapping("/update")
    public String updateMenu(SysMenu menu){
        HashMap<String, Object> map = new HashMap<>();

        if (sysMenuService.updateMenu(menu)>0){
            map.put(SystemConstants.SUCCESS, true);
            map.put(SystemConstants.MESSAGE, "修改成功");
        }else {
            map.put(SystemConstants.SUCCESS, false);
            map.put(SystemConstants.MESSAGE, "修改失败");
        }
        return JSON.toJSONString(map);
    }
    /**
     * 删除菜单
     * @param id
     * @return
     */
    @RequestMapping("/del")
    public String delMenu(Integer id){
        HashMap<String, Object> map = new HashMap<>();

        if (sysMenuService.delMenuById(id)>0){
            map.put(SystemConstants.SUCCESS, true);
            map.put(SystemConstants.MESSAGE, "删除成功");
        }else {
            map.put(SystemConstants.SUCCESS, false);
            map.put(SystemConstants.MESSAGE, "删除失败");
        }
        return JSON.toJSONString(map);
    }

    /**
     * 检查是否含有子级菜单
     * @param id
     * @return
     */
    @RequestMapping("/hasChild")
    public String hasChild(Integer id){
        HashMap<String, Object> map = new HashMap<>();
        Integer child = sysMenuService.checkMenuHasChild(id);
        System.out.println("child = " + child);
        if (child>0){
            map.put(SystemConstants.EXIST, true);
            map.put(SystemConstants.MESSAGE, "该菜单下存在子级，无法删除");
        }else {
            map.put(SystemConstants.EXIST, false);
        }
        return JSON.toJSONString(map);
    }
}
